package br.eng.eliseu.gwt.gestaoWeb.server.command.perfil;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Query;

import br.eng.eliseu.gwt.gestaoWeb.client.ui.sistema.configuracoes.PerfilUsuarioViewVO;
import br.eng.eliseu.gwt.gestaoWeb.model.pessoa.Pessoa;
import br.eng.eliseu.gwt.gestaoWeb.model.pessoa.PessoaDocumento;
import br.eng.eliseu.gwt.gestaoWeb.model.pessoa.PessoaEndereco;
import br.eng.eliseu.gwt.gestaoWeb.model.pessoa.PessoaFone;
import br.eng.eliseu.gwt.gestaoWeb.model.usuario.Usuario;
import br.eng.eliseu.gwt.gestaoWeb.server.command.BaseCommand;
import br.eng.eliseu.gwt.gestaoWeb.shared.ServiceException;

import com.google.inject.persist.Transactional;

public class PerfilUsuarioSalvarCommand extends BaseCommand<PerfilUsuarioViewVO>{

	private static final long serialVersionUID = 2533946752665786288L;

	private PerfilUsuarioViewVO vo;
	
	
	@SuppressWarnings("unchecked")
	@Transactional
	public PerfilUsuarioViewVO call() throws ServiceException {
		
		if ( vo==null){
			return null;
		}

		Query q;
//		GetEntityListCommand cmd;
//		SaveEntityCommand cmdSave;
//		DeleteEntityCommand cmdDelete;
		
//		PerfilUsuarioViewVO perfilAux = new PerfilUsuarioViewVO();
		Usuario usuario = new Usuario();
		Pessoa pessoa = new Pessoa();
		
		/*
		 * Salva e entidade Usuario
		 */
		q = getEntityManager().createNamedQuery("usuario.porUsuario");
		q.setParameter("usuario", vo.getUsuario());
		List<Usuario> lUsuario = q.getResultList();
		if (lUsuario.size() > 0) {
			usuario = lUsuario.get(0);
			usuario.setSenha(vo.getUsuario().getSenha());
			
			usuario = getEntityManager().merge(usuario);
			vo.setUsuario(usuario);
		} else {
			throw new ServiceException("Usuario não encontrado");
		}


		/*
		 * Salva e entidade Pessoa
		 */
		q = getEntityManager().createNamedQuery("pessoa.porPessoa");
		q.setParameter("pessoa", vo.getUsuario().getPessoa());
		List<Pessoa> lPessoa = q.getResultList();
		if (lPessoa.size() > 0) {
			pessoa = lPessoa.get(0);
			pessoa.setNome(vo.getUsuario().getPessoa().getNome());
			pessoa.setDtNascimento(vo.getUsuario().getPessoa().getDtNascimento());
			pessoa.setDtObito(vo.getUsuario().getPessoa().getDtObito());
			pessoa.setSexo(vo.getUsuario().getPessoa().getSexo());
			
			pessoa = getEntityManager().merge(pessoa);
			vo.getUsuario().setPessoa(pessoa);
		} else {
			throw new ServiceException("Pessoa não encontrado");
		}

		
		/* Salvando Documentos da Pessoa
		 * Primeiro eu deleto os documentos que nao estao na ListaVO e estao no banco
		 */
		// --- Monta uma lista so com os documentos que ja tem ID
		List<PessoaDocumento> docJaCadastradoList = new ArrayList<PessoaDocumento>();
		for (PessoaDocumento o : vo.getPessoaDocumentoList()) {
			if(o.getId()!=null){
				docJaCadastradoList.add(o);
			}
		}
		if(docJaCadastradoList.size()>0){
//			q = getEntityManager().createNamedQuery("pessoaDocumento.deleteDocumentoNotIn");

			q = getEntityManager().createQuery("delete from PessoaDocumento u where 1=1 "+
					"and u.pessoa = :pessoa "+
					"and u not in (:lista)");
			q.setParameter("pessoa", vo.getUsuario().getPessoa());
			q.setParameter("lista", docJaCadastradoList);
			q.executeUpdate();
		} else {
			q = getEntityManager().createQuery("delete from PessoaDocumento u where 1=1 "+
					"and u.pessoa = :pessoa");
			q.setParameter("pessoa", vo.getUsuario().getPessoa());
			q.executeUpdate();
		}
		// --- Altera e Inclui os novos
		PessoaDocumento d;
		for (int i=0; i<vo.getPessoaDocumentoList().size();i++) {
			d = vo.getPessoaDocumentoList().get(i);
			vo.getPessoaDocumentoList().set(i, getEntityManager().merge(d));
		}

		
		
		/* Salvando Telefone da Pessoa
		 */
		List<PessoaFone> foneJaCadastradosList = new ArrayList<PessoaFone>();
		for (PessoaFone o : vo.getPessoaFoneList()) {
			if(o.getId()!=null){
				foneJaCadastradosList.add(o);
			}
		}
		if(foneJaCadastradosList.size()>0){
			q = getEntityManager().createQuery("delete from PessoaFone o where 1=1 "+
					"and o.pessoa = :pessoa "+
					"and o not in (:lista)");
			q.setParameter("pessoa", vo.getUsuario().getPessoa());
			q.setParameter("lista", foneJaCadastradosList);
			q.executeUpdate();
		} else {
			q = getEntityManager().createQuery("delete from PessoaFone o where 1=1 "+
					"and o.pessoa = :pessoa ");
			q.setParameter("pessoa", vo.getUsuario().getPessoa());
			q.executeUpdate();
		}
		// --- Altera e Inclui os novos
		PessoaFone f;
		for (int i=0; i<vo.getPessoaFoneList().size();i++) {
			f = vo.getPessoaFoneList().get(i);
			vo.getPessoaFoneList().set(i, getEntityManager().merge(f));
		}

		
		
		/* Deleta Enderecos da Pessoa
		 */

		List<PessoaEndereco> enderecoJaCadastradosList = new ArrayList<PessoaEndereco>();
		for (PessoaEndereco o : vo.getPessoaEnderecoList()) {
			if(o.getId()!=null){
				enderecoJaCadastradosList.add(o);
			}
		}
		if(enderecoJaCadastradosList.size()>0){
			q = getEntityManager().createQuery("delete from PessoaEndereco o where 1=1 "+
					"and o.pessoa = :pessoa "+
					"and o not in (:lista)");
			q.setParameter("pessoa", vo.getUsuario().getPessoa());
			q.setParameter("lista", enderecoJaCadastradosList);
			q.executeUpdate();
		
		} else {
			q = getEntityManager().createQuery("delete from PessoaEndereco o where 1=1 "+
					"and o.pessoa = :pessoa");
			q.setParameter("pessoa", vo.getUsuario().getPessoa());
			q.executeUpdate();
		}
		// --- Altera e Inclui os novos
		PessoaEndereco e;
		for (int i=0; i<vo.getPessoaEnderecoList().size();i++) {
			e = vo.getPessoaEnderecoList().get(i);
			if (e.getPessoa()==null){
				e.setPessoa(vo.getUsuario().getPessoa());
			}
			vo.getPessoaEnderecoList().set(i, getEntityManager().merge(e));
		}

		//******** Tem que gravar o Endereco, id esta null

		return vo;

	}

	public PerfilUsuarioViewVO getVo() {
		return vo;
	}

	public void setVo(PerfilUsuarioViewVO vo) {
		this.vo = vo;
	}

}
